package br.unirio.ticketnator.action;

import java.util.Map;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.struts2.interceptor.RequestAware;

import br.unirio.ticketnator.dao.DAOFactory;
import br.unirio.ticketnator.model.Usuario;
import br.unirio.ticketnator.helper.Validate;
import static com.opensymphony.xwork2.Action.INPUT;
import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UserService extends ActionSupport implements RequestAware {

    private static final long serialVersionUID = -44436774868684L;
    public static final int TAMANHO_PAGINA = 25;
    private Map<String, Object> request;
    private int currentId;
    private int currentPage;
    private String name;
    private String lastname;
    private String email;
    private String password;
    private int currentPermissionCode;
    private List usuarios;

    public List getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List usuarios) {
        this.usuarios = usuarios;
    }
    /**
     * Inicializa o servico de manipulacao de usuarios.
     */
    public UserService() {
        this.currentId = -1;
        this.currentPage = 0;
        request = ActionContext.getContext().getSession();
    }
    public String execute(){
        usuarios = DAOFactory.getUsuarioDAO().lista(currentPage,TAMANHO_PAGINA);
        return SUCCESS;
    }
    /**
     * Indica a memoria de requisicao para a acao.
     */
    @Override
    public void setRequest(Map<String, Object> arg0) {
        this.request = arg0;
    }

    /**
     * "Setta" o id de um usuario
     */
    public void setId(int id) {
        this.currentId = id;
    }

    /**
     * "Setta" o nome de um usuario
     */
    public void setName(String username) {
        this.name = username;
    }

    /**
     * "Setta" o sobrenome de um usuario
     */
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    /**
     * "Setta" o email de usuario
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * "Setta" a senha de um usuario
     */
    public void setPassword(String psw) {
        this.password = psw;
    }

    /**
     * "Setta" o codigo de permissao do usuario
     */
    public void setPermissionCode(int codTipoUsuario) {
        this.currentPermissionCode = codTipoUsuario;
    }

    /**
     * Indica a pagina que esta sendo navegada
     */
    public void setPage(int pagina) {
        this.currentPage = pagina;
    }

    /**
     * Determina se existe uma pagina anterior
     */
    public boolean hasPreviousPage() {
        return currentPage > 0;
    }

    /**
     * Retorna a pagina anterior
     */
    public int getPreviousPage() {
        return hasPreviousPage() ? currentPage - 1 : 0;
    }

    /**
     * Verifica a existencia de uma proxima pagina
     */
    public boolean hasNextPage() {
        int contador = DAOFactory.getUsuarioDAO().conta();
        return contador > (currentPage + 1) * TAMANHO_PAGINA;
    }

    /**
     * Retorna a proxima pagina
     */
    public int getNextPage() {
        return hasNextPage() ? currentPage + 1 : currentPage;
    }

    /**
     * Cria um Usuario
     */
    public String criaUsuario() {
        return INPUT;
    }

    /**
     * Edita um usuario
     */
    public String editaUsuario() {
        request.put("usuarioFull", DAOFactory.getUsuarioDAO().getUsuario(currentId));
        return INPUT;
    }

    /**
     * Deleta usuario
     */
    public String deletaUsuario(int id) {
        DAOFactory.getUsuarioDAO().remove(id);
        return SUCCESS;
    }

    /**
     * Salva as alteracoes no usuario que foi editado
     */
    public String salvaUsuario() {
        Usuario user = new Usuario();
        user.setIdUsuario(currentId);
        user.setNome(name);
        user.setSobrenome(lastname);
        user.setEmail(email);
        user.setSenha(password);
        user.setCodPermissao(currentPermissionCode);
        request.put("usuario", user);

        if (name.length() < 1) {
            addFieldError(name, "Campo Obrigatorio");
            return INPUT;
        }
        if (lastname.length() < 1) {
            addFieldError(lastname, "Campo Obrigatorio");
            return INPUT;
        }
        if (email.length() < 10 && !Validate.validateEmail(email)) {
            addFieldError(email, "email invalido");
            return INPUT;
        }
       //if (!Validate.validatePass(password)) {
       //     addFieldError(password, "senha invalida");
       //     return INPUT;
       // }

        if (user.getIdUsuario() <= 0) {
            DAOFactory.getUsuarioDAO().insere(user);
        } else {
            DAOFactory.getUsuarioDAO().atualiza(user);
        }

        return SUCCESS;


    }
}
